<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>For-loop</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
</head>
<body>

<h1>For-loop <span class="ver">[AHK_L 59+]</span></h1>

<p>为对象中的每个键值对重复执行一组命令.</p>

<pre class="Syntax">For Key [, Value] in Expression</pre>
<h3>参数</h3>
<table class="info">
  <tr> 
    <td width="15%">Key</td>
    <td width="85%">保存每次重复开始时的键的变量名称.</td>
  </tr>
  <tr>
    <td></td>
    <td>保存与当前键关联的值的变量名称.</td>
  </tr>
  <tr>
    <td>Expression</td>
    <td>一个结果为对象的 <a href="../Variables.htm#Expressions">表达式</a> 或包含对象的变量.</td>
  </tr>
</table>

<h3>备注</h3>
<p><i>表达式</i> 只在循环开始前计算一次. 如果其结果不是对象, 立即跳转到循环体后面的语句执行; 否则, 对象的 <code>_NewEnum()</code> 方法被调用来获取 <a href="../objects/Enumerator.htm"><i>枚举数</i></a> 对象. 每次重复开始时, 使用枚举数的 <a href="../objects/Enumerator.htm#Next">Next()</a> 方法获取下一个键值对. 如果 Next() 返回零或空字符串, 循环终止.</p>
<p>现有的键值对可以在循环中修改, 但插入或移除键可能导致一些项目被跳过或枚举多次. 一种解决方法是建立待移除的键列表, 在首个循环结束后使用第二个循环移除这些键. 请注意 <code><a href="../objects/Object.htm#Remove">Object.Remove</a>(<i>first</i>, <i>last</i>)</code> 可以不需要循环来移除键的范围.</p>
<p>在修订版本 59 之前的版本中, 可以在 for-loop 的位置使用下列语句:</p>
<pre>_enum := (<i>Expression</i>)._NewEnum()
while _enum.Next(Key, Value)
{
    ...
}
</pre>
<p>for-loop 后通常跟着一个 <a href="Block.htm">区块</a>, 这是构成循环 <em>体</em> 的语句的集合. 但是, 只含有单语句的循环不要求使用区块 (为此一个 "if" 和与其匹配的 "else" 计算为单语句). 可以随意的使用 One True Brace (OTB) 风格, 这允许开括号和语句在同一行而不是在下面. 例如: <em>for x, y in z {</em></p>
<p>和所有的循环一样, 循环中可以使用 <a href="Break.htm">Break</a>, <a href="Continue.htm">Continue</a> 和 <a href="../Variables.htm#Index">A_Index</a>.</p>

<h3>COM 对象</h3>
<p>因为 <i>Key</i> 和 <i>Value</i> 直接传递给枚举数的 Next() 方法, 它们的值完全取决于枚举数的完成. 对于 COM 对象, <i>Key</i> 包含由 <a href="http://msdn.microsoft.com/en-us/library/ms221369.aspx">IEnumVARIANT::Next()</a> 返回的值而 <i>Value</i> 包含了表示其 <a href="http://msdn.microsoft.com/en-us/library/cc237865.aspx">变量类型</a> 的数字. 例如, 用于 <a href="http://msdn.microsoft.com/en-us/library/x4k5wbx4.aspx">Scripting.Dictionary</a> 对象时, 每个 <i>Key</i> 包含了字典中的一个键而 <i>Value</i> 总为 8 (这是 VT_BSTR, 标准的 COM 字符串类型).</p>

<h3>相关</h3>
<p><a href="../objects/Enumerator.htm">枚举数对象</a>, <a href="../objects/Object.htm#NewEnum">Object.NewEnum()</a>, <a href="While.htm">While-loop</a>, <a href="Loop.htm">Loop</a>, <a href="Until.htm">Until</a>, <a href="Break.htm">Break</a>, <a href="Continue.htm">Continue</a>, <a href="Block.htm">Blocks</a></p>

<h3>示例</h3>
<pre class="NoIndent"><em>; List the key-value pairs of an object:</em>
colours := <a href="../Objects.htm#Arrays">Object</a>("red", 0xFF0000, "blue", 0x0000FF, "green", 0x00FF00)
<em>; The above expression could be used directly in place of "colours" below:</em>
For k, v in colours s .= k "=" v "`n" MsgBox % s
</pre>
<pre class="NoIndent"><em>; List all open Explorer and Internet Explorer windows:</em>
for window in <a href="ComObjCreate.htm">ComObjCreate</a>("<a href="http://msdn.microsoft.com/en-us/library/bb774094.aspx">Shell.Application</a>").Windows windows .= window.<a href="http://msdn.microsoft.com/en-us/library/aa752057.aspx">LocationName</a> " :: " window.<a href="http://msdn.microsoft.com/en-us/library/aa752058.aspx">LocationURL</a> "`n" MsgBox % windows</pre>

</body>
</html>